# -*- coding: utf-8 -*-

"""
  @author: tangliqi
  @date: 2022/12/2 11:04
  @python version: 3.6 
  @contact me: 110
  ---------------------------------------
  @desc: python设计模式实现 => 职责链模式.py
"""
from abc import abstractmethod


# 通过一个员工加薪审批的例子来说明
# 一个员工的加薪，需要通过OA系统发起申请，并由对应领导进行审批。
# 分别通过直属领导、二级领导、部门领导、总经理的审核，全部通过后才能加薪。
# 职责链的构成：1.抽象职责链接收基类 2.职责链接收具体类 3.请求类

# ============================  抽象职责链接收基类  ============================
class SalaryRaise:
    @abstractmethod
    def agree(self) -> bool:
        """返回True or False，是否通过"""
        pass


# ============================  职责链接收具体类  ============================
class Level1Flow(SalaryRaise):

    def agree(self):
        print("--- 直属领导同意。 ---")
        return True

    def __str__(self):
        return "直属领导"


class Level2Flow(SalaryRaise):

    def agree(self):
        print("--- 二级领导同意。 ---")
        return True

    def __str__(self):
        return "二级领导"


class DepartmentFlow(SalaryRaise):

    def agree(self):
        print("--- 部门领导同意。 ---")
        return True

    def __str__(self):
        return "部门领导"


class CEOFlow(SalaryRaise):

    def agree(self):
        print("--- 总经理不同意。 ---")
        return False

    def __str__(self):
        return "总经理"


# ============================  请求者  ============================
class ClientDemo:
    def __init__(self, chains):
        self.chains = chains

    def start(self):
        """开始请求"""
        print("--- 填写自己的加薪请求、理由 --- ")
        for chain in self.chains:
            c = chain()
            result = c.agree()
            if not result:
                print("{} 环节未通过".format(c))
                break


if __name__ == '__main__':
    # 构造职责链
    salary_raise_chain = [Level1Flow, Level2Flow, DepartmentFlow, CEOFlow]

    # 请求
    ClientDemo(salary_raise_chain).start()
